/*
 * Copyright 2010-2024 Eric Kok et al.
 *
 * Transdroid is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Transdroid is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Transdroid.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.transdroid.core.gui.navigation;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.Window;

import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.transdroid.core.gui.TorrentsActivity_;

import java.io.Serializable;

/**
 * Helper class that show a dialog either as pop-up or as full screen activity. Should be used by calling
 * {@link #showDialog(Context, DialogSpecification)} with in instance of the dialog specification that should be shown,
 * from the calling activity's {@link Activity#onCreateDialog(int)}.
 *
 * @author Eric Kok
 */
@EActivity
public class DialogHelper extends Activity {

    @Extra
    protected DialogSpecification dialog;

    /**
     * Call this from {@link Activity#onCreateDialog(int)}, supplying an instance of the {@link DialogSpecification}
     * that should be shown to the user.
     *
     * @param context The activity that calls this method and which will own the constructed dialog
     * @param dialog  An instance of the specification for the dialog that needs to be shown
     * @return Either an instance of a {@link Dialog} that the activity should further control or null if the dialog
     * will instead be opened as a full screen activity
     */
    public static Dialog showDialog(Context context, DialogSpecification dialog) {

        // If the device is large (i.e. a tablet) then return a dialog to show
        if (!NavigationHelper_.getInstance_(context).isSmallScreen())
            return new PopupDialog(context, dialog);

        // This is a small device; create a full screen dialog (which is just an activity)
        DialogHelper_.intent(context).dialog(dialog).start();
        return null;

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(dialog.getDialogLayoutId());
        // TODO getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(dialog.getDialogMenuId(), menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            // Action bar up button clicked; navigate up all the way back to the torrents activity
            TorrentsActivity_.intent(this).flags(Intent.FLAG_ACTIVITY_CLEAR_TOP).start();
            return true;
        }
        return dialog.onMenuItemSelected(this, item.getItemId());
    }

    /**
     * Specification for some dialog that can be show to the user, consisting of a custom layout and possibly an action
     * bar menu. Warning: the action bar, and thus the menu options, is only shown when the dialog is presented as full
     * screen activity. Use only for unimportant actions.
     */
    public interface DialogSpecification extends Serializable {
        int getDialogLayoutId();

        int getDialogMenuId();

        boolean onMenuItemSelected(Activity ownerActivity, int selectedItemId);
    }

    /**
     * A specific dialog that shows some layout (resource) as contents. It has no buttons or other chrome.
     */
    protected static class PopupDialog extends Dialog {
        public PopupDialog(Context context, DialogSpecification dialog) {
            super(context);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(dialog.getDialogLayoutId());
        }
    }

}
